package com.example.alibabavodossservice.vod.watermark;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.vod.model.v20170321.*;
import org.springframework.beans.BeanUtils;

import java.util.List;

import static com.example.alibabavodossservice.vod.InitVODConstants.VOD_CLIENT;


/**
 * desc: 处理水印指令集
 * @author xugenyin
 */
public class Cmd {
    /**
     * 构建HLS标准加密的配置信息
     *
     * @return JSONObject 加密配置信息
     * @throws ClientException
     */
    public static JSONObject buildEncryptConfig(DefaultAcsClient client) throws ClientException {
        //注意：Client为VOD的sdk client。可以通过 initVodClient 方法初始化
        GenerateKMSDataKeyResponse response = generateDataKey();
        JSONObject encryptConfig = new JSONObject();
        //解密接口地址，该参数需要将每次生成的密文密钥与接口URL拼接生成，表示每个视频的解密的密文密钥都不一样
        //至于Ciphertext这个解密接口参数的名称，用户可自行制定，这里只作为参考参数名称
        encryptConfig.put("DecryptKeyUri", "http://example.aliyundoc.com/decrypt?" +
                "Ciphertext=" + response.getCiphertextBlob());
        //密钥服务的类型，目前只支持KMS
        encryptConfig.put("KeyServiceType", "KMS");
        //密文密钥
        encryptConfig.put("CipherText", response.getCiphertextBlob());
        return encryptConfig;
    }

    /**
     * 1、构建覆盖参数，目前只支持图片水印文件地址、文字水印的内容覆盖。
     * 2、需要替换的水印信息，对应水印ID必须是关联在指定的模板ID（即TranscodeTemplateId）中。
     * 3、不支持通过媒体处理接口去增加一个没有关联上的水印。
     * 注意：图片水印的文件存储源站需要和发起转码的视频存储源站一致。
     *
     * @return JSONObject 覆盖参数
     */
    public static JSONObject buildOverrideParams(String WatermarkId, String FileUrl, String WaterMarkContent) {
        JSONObject overrideParams = new JSONObject();
        JSONArray watermarks = new JSONArray();
        //图片水印文件地址替换
        JSONObject watermark1 = new JSONObject();
        //模板上面关联需要替换的水印文件图片水印ID
        watermark1.put("WatermarkId", WatermarkId);
        //需要替换成对应图片水印文件的OSS地址，水印文件存储源站需要和视频存储源站一致
        watermark1.put("FileUrl", FileUrl);
        //文字水印内容替换
        JSONObject watermark2 = new JSONObject();
        //模板上面关联需要替换内容的文字水印ID
        watermark2.put("WatermarkId", WatermarkId);
        //需要替换成对应的内容
        watermark2.put("Content", WaterMarkContent);
        watermarks.add(watermark2);
        overrideParams.put("Watermarks", watermarks);
        return overrideParams;
    }

    /**
     * 生成加密需要的密钥，response中包含密文密钥和明文密钥，用户只需要将密文密钥传递给点播即可
     *
     * @return GenerateKMSDataKeyResponse 生成加密需要的密钥响应数据
     * @throws ClientException 连接异常
     */
    public static GenerateKMSDataKeyResponse generateDataKey() throws ClientException {
        GenerateKMSDataKeyRequest request = new GenerateKMSDataKeyRequest();
        return VOD_CLIENT.getAcsResponse(request);
    }

    /**
     * 构建雪碧图截图配置
     *
     * @return
     */
    public static JSONObject buildSnapshotTemplateConfig() {
        JSONObject spriteSnapshotConfig = new JSONObject();
        spriteSnapshotConfig.put("CellWidth", "120");
        spriteSnapshotConfig.put("CellHeight", "68");
        spriteSnapshotConfig.put("Columns", "3");
        spriteSnapshotConfig.put("Lines", "10");
        spriteSnapshotConfig.put("Padding", "20");
        spriteSnapshotConfig.put("Margin", "50");
        //保留雪碧图原始图
        spriteSnapshotConfig.put("KeepCellPic", "keep");
        spriteSnapshotConfig.put("Color", "tomato");
        return spriteSnapshotConfig;
    }

    /**
     * 添加水印配置信息函数
     * 目前支持的图片水印格式包括静态图片（PNG）、动态图片（GIF、APNG、MOV）
     * @param watermarkParameter 水印参数
     * @return AddWatermarkResponse 添加水印配置信息响应数据
     * @throws Exception 连接异常
     */
    public static AddWatermarkResponse addWatermark(WatermarkParameter watermarkParameter) throws Exception {
        AddWatermarkRequest watermarkRequest = new AddWatermarkRequest();
        BeanUtils.copyProperties(watermarkParameter, watermarkRequest);
        //水印配置数据
        JSONObject watermarkConfig = null;
        //图片水印的位置配置数据
        watermarkConfig = buildImageWatermarkConfig();
        return VOD_CLIENT.getAcsResponse(watermarkRequest);
    }

    /**
     * 构建图片水印的配置数据，根据具体设置需求修改对应的参数值
     *
     * @return JSONObject 图片水印的配置数据
     */
    public static JSONObject buildImageWatermarkConfig() {
        JSONObject watermarkConfig = new JSONObject();
        //水印的横向偏移距离
        watermarkConfig.put("Dx", "8");
        //水印的纵向偏移距离
        watermarkConfig.put("Dy", "8");
        //水印显示的宽
        watermarkConfig.put("Width", "55");
        //水印显示的高
        watermarkConfig.put("Height", "55");
        //水印显示的相对位置(左上、右上、左下、右下)
        watermarkConfig.put("ReferPos", "BottomRight");
        //水印显示的时间线(开始显示和结束显示时间)
        JSONObject timeline = new JSONObject();
        //水印开始显示时间
        timeline.put("Start", "2");
        //水印结束显示时间
        timeline.put("Duration", "ToEND");
        watermarkConfig.put("Timeline", timeline);
        return watermarkConfig;
    }

    /**
     * 修改水印配置信息函数
     * 注意：不支持图片文件地址的修改，如果更换请创建新的水印信息
     */
    public static UpdateWatermarkResponse updateWatermark(WatermarkParameter watermarkParameter) throws Exception {
        UpdateWatermarkRequest updateWatermarkRequest = new UpdateWatermarkRequest();
        BeanUtils.copyProperties(watermarkParameter, updateWatermarkRequest);
        //水印配置数据
        JSONObject watermarkConfig = null;
        //文字水印的位置配置数据
        watermarkConfig = buildTextWatermarkConfig(watermarkParameter.getWatermarkContent());
        updateWatermarkRequest.setWatermarkConfig(watermarkConfig.toJSONString());
        //文字水印:Text; 图片水印:Image
        return VOD_CLIENT.getAcsResponse(updateWatermarkRequest);
    }

    /**
     * 构建文字水印的配置数据，根据具体设置需求修改对应的参数值
     *
     * @return JSONObject 文字水印的配置数据
     */
    public static JSONObject buildTextWatermarkConfig(String watermarkContent) {
        JSONObject watermarkConfig = new JSONObject();
        //文字水印显示的内容
        watermarkConfig.put("Content", "testwatermark");
        //文字水印的字体名称
        watermarkConfig.put("FontName", "SimSun");
        //文字水印的字体大小
        watermarkConfig.put("FontSize", 25);
        //文字水印的颜色(也可为RGB颜色取值，例如:#000000)
        watermarkConfig.put("FontColor", "Black");
        //文字水印的透明度
        watermarkConfig.put("FontAlpha", "0.2");
        //文字水印的字体描边颜色(也可为RGB颜色取值，例如:#ffffff)
        watermarkConfig.put("BorderColor", "White");
        //文字水印的描边宽度
        watermarkConfig.put("BorderWidth", 1);
        //文字水印距离视频画面上边的偏移距离
        watermarkConfig.put("Top", 20);
        //文字水印距离视频画面左边的偏移距离
        watermarkConfig.put("Left", 15);
        return watermarkConfig;
    }

    /**
     * 查询单个水印信息
     *
     * @param uploadWatermarkId 水印ID
     * @return GetWatermarkResponse.WatermarkInfo 水印信息
     * @throws ClientException 连接异常
     */
    public static GetWatermarkResponse.WatermarkInfo getWatermarkInfo(String uploadWatermarkId) throws ClientException {
        GetWatermarkRequest getWatermarkRequest = new GetWatermarkRequest();
        getWatermarkRequest.setWatermarkId(uploadWatermarkId);
        return VOD_CLIENT.getAcsResponse(getWatermarkRequest).getWatermarkInfo();
    }

    /**
     * 根据应用id查询水印列表
     *
     * @param appId 应用id
     * @return List<ListWatermarkResponse.WatermarkInfo> 水印列表
     * @throws ClientException 连接异常
     */
    public static List<ListWatermarkResponse.WatermarkInfo> getWatermarkList(String appId) throws ClientException {
        ListWatermarkRequest listWatermarkRequest = new ListWatermarkRequest();
        listWatermarkRequest.setAppId(appId);
        return VOD_CLIENT.getAcsResponse(listWatermarkRequest).getWatermarkInfos();
    }

}
